{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. 模型对比"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.1 LSTM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import numpy as np \n",
    "import matplotlib.pyplot as plt\n",
    "plt.style.use('fivethirtyeight')\n",
    "import pandas as pd\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Dense, LSTM, Dropout, GRU, Bidirectional\n",
    "import math\n",
    "from sklearn.metrics import mean_squared_error"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Open</th>\n",
       "      <th>High</th>\n",
       "      <th>Low</th>\n",
       "      <th>Close</th>\n",
       "      <th>Adj Close</th>\n",
       "      <th>Volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>2016-11-02</td>\n",
       "      <td>778.200012</td>\n",
       "      <td>781.650024</td>\n",
       "      <td>763.450012</td>\n",
       "      <td>768.700012</td>\n",
       "      <td>768.700012</td>\n",
       "      <td>1872400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2016-11-03</td>\n",
       "      <td>767.250000</td>\n",
       "      <td>769.950012</td>\n",
       "      <td>759.030029</td>\n",
       "      <td>762.130005</td>\n",
       "      <td>762.130005</td>\n",
       "      <td>1943200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2016-11-04</td>\n",
       "      <td>750.659973</td>\n",
       "      <td>770.359985</td>\n",
       "      <td>750.560974</td>\n",
       "      <td>762.020020</td>\n",
       "      <td>762.020020</td>\n",
       "      <td>2134800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2016-11-07</td>\n",
       "      <td>774.500000</td>\n",
       "      <td>785.190002</td>\n",
       "      <td>772.549988</td>\n",
       "      <td>782.520020</td>\n",
       "      <td>782.520020</td>\n",
       "      <td>1585100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2016-11-08</td>\n",
       "      <td>783.400024</td>\n",
       "      <td>795.632996</td>\n",
       "      <td>780.190002</td>\n",
       "      <td>790.510010</td>\n",
       "      <td>790.510010</td>\n",
       "      <td>1350800</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  Open        High         Low       Close   Adj Close  \\\n",
       "Date                                                                     \n",
       "2016-11-02  778.200012  781.650024  763.450012  768.700012  768.700012   \n",
       "2016-11-03  767.250000  769.950012  759.030029  762.130005  762.130005   \n",
       "2016-11-04  750.659973  770.359985  750.560974  762.020020  762.020020   \n",
       "2016-11-07  774.500000  785.190002  772.549988  782.520020  782.520020   \n",
       "2016-11-08  783.400024  795.632996  780.190002  790.510010  790.510010   \n",
       "\n",
       "             Volume  \n",
       "Date                 \n",
       "2016-11-02  1872400  \n",
       "2016-11-03  1943200  \n",
       "2016-11-04  2134800  \n",
       "2016-11-07  1585100  \n",
       "2016-11-08  1350800  "
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# read the data\n",
    "dataset = pd.read_csv('FB.csv', index_col=\"Date\")\n",
    "dataset.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "training_set = dataset[:'2017-10-01'].iloc[:,1:2].values\n",
    "test_set = dataset['2017-10-01':].iloc[:,1:2].values\n",
    "\n",
    "plt.plot(training_set, color='blue', label='Training set')\n",
    "plt.xlabel('Time')\n",
    "plt.ylabel('Price')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 归一化，记得要将预测结果反归一化回去\n",
    "sc = MinMaxScaler(feature_range=(0,1))\n",
    "training_set_scaled = sc.fit_transform(training_set)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 制作用于训练的数据集\n",
    "lookback = 20\n",
    "X_train = []   # feature\n",
    "y_train = []   # lable\n",
    "for i in range(lookback, len(training_set)):\n",
    "    # 序列长度为19\n",
    "    X_train.append(training_set_scaled[i-20:i,0])\n",
    "    # 标签长度为1\n",
    "    y_train.append(training_set_scaled[i,0])\n",
    "    \n",
    "X_train, y_train = np.array(X_train), np.array(y_train)\n",
    "\n",
    "X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 自定义损失函数\n",
    "# 防止分母为0\n",
    "from keras import backend as K\n",
    "\n",
    "smooth = 1e-5\n",
    "\n",
    "def dice_coef_loss(y_true, y_pred):\n",
    " \n",
    "    y_truef = K.flatten(y_true)  # 将 y_true 拉为一维\n",
    "    y_predf = K.flatten(y_pred)\n",
    "    intersection = K.sum(y_truef * y_predf)\n",
    "    dice_coef = (2 * intersection + smooth) / (K.sum(y_truef) + K.sum(y_predf) + smooth)\n",
    " \n",
    "    return 1-dice_coef"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "209/209 [==============================] - 3s 14ms/step - loss: 0.4976\n",
      "Epoch 2/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: 0.1388\n",
      "Epoch 3/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.0178\n",
      "Epoch 4/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.0885\n",
      "Epoch 5/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.1452\n",
      "Epoch 6/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.2047\n",
      "Epoch 7/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.2648\n",
      "Epoch 8/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3183\n",
      "Epoch 9/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3718\n",
      "Epoch 10/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4222\n",
      "Epoch 11/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4828\n",
      "Epoch 12/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5400\n",
      "Epoch 13/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: -0.6185\n",
      "Epoch 14/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.6358\n",
      "Epoch 15/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5936\n",
      "Epoch 16/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -1.0566\n",
      "Epoch 17/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4007\n",
      "Epoch 18/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4870\n",
      "Epoch 19/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4971\n",
      "Epoch 20/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5039\n",
      "Epoch 21/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5086\n",
      "Epoch 22/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5188\n",
      "Epoch 23/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: -0.5250\n",
      "Epoch 24/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5336\n",
      "Epoch 25/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5426\n",
      "Epoch 26/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5500\n",
      "Epoch 27/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5721\n",
      "Epoch 28/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.6195\n",
      "Epoch 29/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.6370\n",
      "Epoch 30/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.7104\n",
      "Epoch 31/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -1.5071\n",
      "Epoch 32/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3378\n",
      "Epoch 33/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3357\n",
      "Epoch 34/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3449\n",
      "Epoch 35/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3403\n",
      "Epoch 36/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3393\n",
      "Epoch 37/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3398\n",
      "Epoch 38/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3479\n",
      "Epoch 39/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3473\n",
      "Epoch 40/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3471\n",
      "Epoch 41/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3546\n",
      "Epoch 42/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3610\n",
      "Epoch 43/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3600\n",
      "Epoch 44/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3656\n",
      "Epoch 45/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3754\n",
      "Epoch 46/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3865\n",
      "Epoch 47/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3975\n",
      "Epoch 48/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4186\n",
      "Epoch 49/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4419\n",
      "Epoch 50/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4830\n",
      "Epoch 51/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5766\n",
      "Epoch 52/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.7927\n",
      "Epoch 53/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5475\n",
      "Epoch 54/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3622\n",
      "Epoch 55/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4221\n",
      "Epoch 56/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4470\n",
      "Epoch 57/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4647\n",
      "Epoch 58/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4861\n",
      "Epoch 59/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4969\n",
      "Epoch 60/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5111\n",
      "Epoch 61/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5312\n",
      "Epoch 62/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5412\n",
      "Epoch 63/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5628\n",
      "Epoch 64/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.6002\n",
      "Epoch 65/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.6716\n",
      "Epoch 66/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.6138\n",
      "Epoch 67/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4118\n",
      "Epoch 68/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4654\n",
      "Epoch 69/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5973\n",
      "Epoch 70/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -1.4062\n",
      "Epoch 71/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3015\n",
      "Epoch 72/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3523\n",
      "Epoch 73/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3992\n",
      "Epoch 74/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4184\n",
      "Epoch 75/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4397\n",
      "Epoch 76/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4498\n",
      "Epoch 77/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4627\n",
      "Epoch 78/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4653\n",
      "Epoch 79/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4702\n",
      "Epoch 80/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4721\n",
      "Epoch 81/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4887\n",
      "Epoch 82/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4916\n",
      "Epoch 83/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4915\n",
      "Epoch 84/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5072\n",
      "Epoch 85/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5171\n",
      "Epoch 86/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5408\n",
      "Epoch 87/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5581\n",
      "Epoch 88/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.6119\n",
      "Epoch 89/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.6816\n",
      "Epoch 90/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -1.3954\n",
      "Epoch 91/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.2884\n",
      "Epoch 92/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3324\n",
      "Epoch 93/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3564\n",
      "Epoch 94/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.3721\n",
      "Epoch 95/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4032\n",
      "Epoch 96/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4054\n",
      "Epoch 97/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.4453\n",
      "Epoch 98/100\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "209/209 [==============================] - 0s 1ms/step - loss: -0.5116\n",
      "Epoch 99/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -0.6654\n",
      "Epoch 100/100\n",
      "209/209 [==============================] - 0s 1ms/step - loss: -1.6411\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.callbacks.History at 0x1e0989c84e0>"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 定义模型LSTM\n",
    "regressor = Sequential()\n",
    "# 往模型里面加模块， first LSTM layer\n",
    "regressor.add(LSTM(units=32,return_sequences=True, input_shape=(X_train.shape[1],1)))\n",
    "# regressor.add(Dropout(0.2))\n",
    "# second LSTM layer\n",
    "# regressor.add(LSTM(units=80, return_sequences=True))\n",
    "# regressor.add(Dropout(0.2))\n",
    "# third LSTM layer\n",
    "regressor.add(LSTM(units=32))\n",
    "# regressor.add(Dropout(0.2))\n",
    "# output layer\n",
    "regressor.add(Dense(units=1))\n",
    "# compile the LSTM， loss: 'mse', 'mae'\n",
    "# regressor.compile(optimizer='rmsprop', loss='mae')\n",
    "regressor.compile(optimizer='rmsprop', loss=dice_coef_loss)\n",
    "# fit to the training set\n",
    "regressor.fit(X_train, y_train, epochs=100, batch_size=64)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 对测试集+lookback的数据进行归一化（保证跟训练时归一化操作相同）\n",
    "dataset_total = pd.concat((dataset['High'][:'2017-10-01'], dataset['High']['2017-10-01':]), axis=0)\n",
    "inputs = dataset_total[len(dataset_total) - len(test_set) - 20:].values\n",
    "inputs = inputs.reshape(-1,1)\n",
    "inputs = sc.transform(inputs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Inference过程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_test = []\n",
    "for i in range(lookback, len(inputs)):\n",
    "    X_test.append(inputs[i - lookback:i,0])\n",
    "X_test = np.array(X_test)\n",
    "X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1],1))\n",
    "LSTM_predicted_stock_price = regressor.predict(X_test)\n",
    "LSTM_predicted_stock_price = sc.inverse_transform(LSTM_predicted_stock_price)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(test_set, color='red', label='Real Price')\n",
    "plt.plot(LSTM_predicted_stock_price, color='blue', label='Predicted Price')\n",
    "plt.title('LSTM')\n",
    "plt.xlabel('Time')\n",
    "plt.ylabel('Price')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "root mean squared error is 274.72889723060314.\n"
     ]
    }
   ],
   "source": [
    "LSTM_rmse = mean_squared_error(test_set, LSTM_predicted_stock_price)\n",
    "print (\"root mean squared error is {}.\".format(LSTM_rmse))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.2 GRU"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "209/209 [==============================] - 2s 10ms/step - loss: 0.1604\n",
      "Epoch 2/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0110\n",
      "Epoch 3/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0079\n",
      "Epoch 4/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0062\n",
      "Epoch 5/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0048\n",
      "Epoch 6/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0054\n",
      "Epoch 7/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0037\n",
      "Epoch 8/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0059\n",
      "Epoch 9/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0041\n",
      "Epoch 10/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0050\n",
      "Epoch 11/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0033\n",
      "Epoch 12/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0034\n",
      "Epoch 13/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0050\n",
      "Epoch 14/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0036\n",
      "Epoch 15/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0039\n",
      "Epoch 16/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0034\n",
      "Epoch 17/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0032\n",
      "Epoch 18/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0046\n",
      "Epoch 19/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0024\n",
      "Epoch 20/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0036\n",
      "Epoch 21/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0034\n",
      "Epoch 22/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0031\n",
      "Epoch 23/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0025\n",
      "Epoch 24/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0042\n",
      "Epoch 25/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0021\n",
      "Epoch 26/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0027\n",
      "Epoch 27/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0023\n",
      "Epoch 28/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0032\n",
      "Epoch 29/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0023\n",
      "Epoch 30/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0023\n",
      "Epoch 31/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0030\n",
      "Epoch 32/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0025\n",
      "Epoch 33/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0030\n",
      "Epoch 34/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0025\n",
      "Epoch 35/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0017\n",
      "Epoch 36/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0027\n",
      "Epoch 37/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0020\n",
      "Epoch 38/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0028\n",
      "Epoch 39/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0019\n",
      "Epoch 40/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0017\n",
      "Epoch 41/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0023\n",
      "Epoch 42/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0017\n",
      "Epoch 43/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0032\n",
      "Epoch 44/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0018\n",
      "Epoch 45/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0016\n",
      "Epoch 46/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0027\n",
      "Epoch 47/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0016\n",
      "Epoch 48/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0015\n",
      "Epoch 49/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0028\n",
      "Epoch 50/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0016\n",
      "Epoch 51/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0016\n",
      "Epoch 52/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0030\n",
      "Epoch 53/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0014\n",
      "Epoch 54/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0017\n",
      "Epoch 55/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0019\n",
      "Epoch 56/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0022\n",
      "Epoch 57/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0016\n",
      "Epoch 58/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0029\n",
      "Epoch 59/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0017\n",
      "Epoch 60/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0017\n",
      "Epoch 61/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0015\n",
      "Epoch 62/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0022\n",
      "Epoch 63/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0018\n",
      "Epoch 64/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0017\n",
      "Epoch 65/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0021\n",
      "Epoch 66/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0023\n",
      "Epoch 67/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0013\n",
      "Epoch 68/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0017\n",
      "Epoch 69/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0019\n",
      "Epoch 70/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0015\n",
      "Epoch 71/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0026\n",
      "Epoch 72/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0015\n",
      "Epoch 73/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0019\n",
      "Epoch 74/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0018\n",
      "Epoch 75/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0013\n",
      "Epoch 76/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0017\n",
      "Epoch 77/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0020\n",
      "Epoch 78/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0021\n",
      "Epoch 79/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0020\n",
      "Epoch 80/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0013\n",
      "Epoch 81/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0016\n",
      "Epoch 82/100\n",
      "209/209 [==============================] - ETA: 0s - loss: 0.002 - 0s 2ms/step - loss: 0.0020\n",
      "Epoch 83/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0018\n",
      "Epoch 84/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0015\n",
      "Epoch 85/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0021\n",
      "Epoch 86/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0015\n",
      "Epoch 87/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0022\n",
      "Epoch 88/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0014\n",
      "Epoch 89/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0014\n",
      "Epoch 90/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0025\n",
      "Epoch 91/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0012\n",
      "Epoch 92/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0024\n",
      "Epoch 93/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0017\n",
      "Epoch 94/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0018\n",
      "Epoch 95/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0018\n",
      "Epoch 96/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0012\n",
      "Epoch 97/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0016\n",
      "Epoch 98/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0015\n",
      "Epoch 99/100\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0022\n",
      "Epoch 100/100\n",
      "209/209 [==============================] - 0s 2ms/step - loss: 0.0014\n",
      "Saved model to disk\n"
     ]
    }
   ],
   "source": [
    "regressorGRU = Sequential()\n",
    "regressorGRU.add(GRU(units=32, return_sequences=True, input_shape=(X_train.shape[1],1)))\n",
    "# regressorGRU.add(Dropout(0.3))\n",
    "regressorGRU.add(GRU(units=32))\n",
    "# regressorGRU.add(Dropout(0.3))\n",
    "regressorGRU.add(Dense(units=1))\n",
    "regressorGRU.compile(optimizer='rmsprop', loss='mean_squared_error')\n",
    "regressorGRU.fit(X_train, y_train, epochs=100, batch_size=32)\n",
    "\n",
    "# serialize model to JSON\n",
    "model_json = regressorGRU.to_json()\n",
    "with open(\"model.json\", \"w\") as json_file:\n",
    "    json_file.write(model_json)\n",
    "# serialize weights to HDF5\n",
    "regressorGRU.save_weights(\"model.h5\")\n",
    "print(\"Saved model to disk\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_test = []\n",
    "for i in range(lookback, len(inputs)):\n",
    "    X_test.append(inputs[i-lookback:i,0])\n",
    "X_test = np.array(X_test)\n",
    "X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1],1))\n",
    "GRU_predicted_stock_price = regressorGRU.predict(X_test)\n",
    "GRU_predicted_stock_price = sc.inverse_transform(GRU_predicted_stock_price)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(test_set, color='red', label='Real Price')\n",
    "plt.plot(GRU_predicted_stock_price, color='blue', label='Predicted Price')\n",
    "plt.title('GRU')\n",
    "plt.xlabel('Time')\n",
    "plt.ylabel('Price')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "root mean squared error is 15.663590761672758.\n"
     ]
    }
   ],
   "source": [
    "GRU_rmse = math.sqrt(mean_squared_error(test_set, GRU_predicted_stock_price))\n",
    "print (\"root mean squared error is {}.\".format(GRU_rmse))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.3 BiLSTM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "209/209 [==============================] - 3s 17ms/step - loss: 0.1264\n",
      "Epoch 2/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0095\n",
      "Epoch 3/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0109\n",
      "Epoch 4/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0081\n",
      "Epoch 5/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0160\n",
      "Epoch 6/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0076\n",
      "Epoch 7/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0070\n",
      "Epoch 8/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0154\n",
      "Epoch 9/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0068\n",
      "Epoch 10/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0095\n",
      "Epoch 11/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0065\n",
      "Epoch 12/100\n",
      "209/209 [==============================] - 1s 3ms/step - loss: 0.0086\n",
      "Epoch 13/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0086\n",
      "Epoch 14/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0096\n",
      "Epoch 15/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0066\n",
      "Epoch 16/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0069\n",
      "Epoch 17/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0073\n",
      "Epoch 18/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0057\n",
      "Epoch 19/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0065\n",
      "Epoch 20/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0084\n",
      "Epoch 21/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0055\n",
      "Epoch 22/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0071\n",
      "Epoch 23/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0047\n",
      "Epoch 24/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0086\n",
      "Epoch 25/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0047\n",
      "Epoch 26/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0058\n",
      "Epoch 27/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0061\n",
      "Epoch 28/100\n",
      "209/209 [==============================] - 1s 3ms/step - loss: 0.0050\n",
      "Epoch 29/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0050\n",
      "Epoch 30/100\n",
      "209/209 [==============================] - 1s 3ms/step - loss: 0.0058\n",
      "Epoch 31/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0039\n",
      "Epoch 32/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0069\n",
      "Epoch 33/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0047\n",
      "Epoch 34/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0051\n",
      "Epoch 35/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0036\n",
      "Epoch 36/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0061\n",
      "Epoch 37/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0047\n",
      "Epoch 38/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0037\n",
      "Epoch 39/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0040\n",
      "Epoch 40/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0048\n",
      "Epoch 41/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0046\n",
      "Epoch 42/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0046\n",
      "Epoch 43/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0047\n",
      "Epoch 44/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0045\n",
      "Epoch 45/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0033\n",
      "Epoch 46/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0053\n",
      "Epoch 47/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0031\n",
      "Epoch 48/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0054\n",
      "Epoch 49/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0033\n",
      "Epoch 50/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0041\n",
      "Epoch 51/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0027\n",
      "Epoch 52/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0052\n",
      "Epoch 53/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0034\n",
      "Epoch 54/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0045\n",
      "Epoch 55/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0030\n",
      "Epoch 56/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0037\n",
      "Epoch 57/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0030\n",
      "Epoch 58/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0037\n",
      "Epoch 59/100\n",
      "209/209 [==============================] - 1s 3ms/step - loss: 0.0037\n",
      "Epoch 60/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0028\n",
      "Epoch 61/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0039\n",
      "Epoch 62/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0035\n",
      "Epoch 63/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0036\n",
      "Epoch 64/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0025\n",
      "Epoch 65/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0048\n",
      "Epoch 66/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0024\n",
      "Epoch 67/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0039\n",
      "Epoch 68/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0030\n",
      "Epoch 69/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0025\n",
      "Epoch 70/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0039\n",
      "Epoch 71/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0027\n",
      "Epoch 72/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0022\n",
      "Epoch 73/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0036\n",
      "Epoch 74/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0028\n",
      "Epoch 75/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0026\n",
      "Epoch 76/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0030\n",
      "Epoch 77/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0031\n",
      "Epoch 78/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0019\n",
      "Epoch 79/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0037\n",
      "Epoch 80/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0022\n",
      "Epoch 81/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0026\n",
      "Epoch 82/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0033\n",
      "Epoch 83/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0022\n",
      "Epoch 84/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0026\n",
      "Epoch 85/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0021\n",
      "Epoch 86/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0031\n",
      "Epoch 87/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0018\n",
      "Epoch 88/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0034\n",
      "Epoch 89/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0022\n",
      "Epoch 90/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0017\n",
      "Epoch 91/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0033\n",
      "Epoch 92/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0021\n",
      "Epoch 93/100\n",
      "209/209 [==============================] - 1s 3ms/step - loss: 0.0031\n",
      "Epoch 94/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0022\n",
      "Epoch 95/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0024\n",
      "Epoch 96/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0023\n",
      "Epoch 97/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0023\n",
      "Epoch 98/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0017\n",
      "Epoch 99/100\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "209/209 [==============================] - 1s 3ms/step - loss: 0.0030\n",
      "Epoch 100/100\n",
      "209/209 [==============================] - 1s 4ms/step - loss: 0.0021\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.callbacks.History at 0x1e08e69bfd0>"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# BiLSTM\n",
    "regressorBiLSTM = Sequential()\n",
    "regressorBiLSTM.add(Bidirectional(LSTM(units=32, return_sequences=True), input_shape=(X_train.shape[1],1), merge_mode='concat'))\n",
    "# regressorBiLSTM.add(Dropout(0.2))\n",
    "regressorBiLSTM.add(Bidirectional(LSTM(units=32)))\n",
    "# regressorBiLSTM.add(Dropout(0.2))\n",
    "regressorBiLSTM.add(Dense(units=1))\n",
    "regressorBiLSTM.compile(optimizer='rmsprop', loss='mean_squared_error')\n",
    "regressorBiLSTM.fit(X_train, y_train, epochs=100, batch_size=32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_test = []\n",
    "for i in range(lookback, len(inputs)):\n",
    "    X_test.append(inputs[i-lookback:i,0])\n",
    "X_test = np.array(X_test)\n",
    "X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1],1))\n",
    "BiLSTM_predicted_stock_price = regressorBiLSTM.predict(X_test)\n",
    "BiLSTM_predicted_stock_price = sc.inverse_transform(BiLSTM_predicted_stock_price)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbMAAAEXCAYAAAAnYKp/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzdd3hUxfrA8e9syyaB0Hu1gPQmCiQUgxBpFogFlCYIIqBy9aL8bHj1ioj9KkoTpChKsdEFQTpWpAhKqNI7CSnb5/fHbpZt6dnsJpnP8+yTnNmz58yelHdn5j0zQkqJoiiKohRnmlBXQFEURVEKSgUzRVEUpdhTwUxRFEUp9lQwUxRFUYo9FcwURVGUYk8FM0VRFKXYU8FMUUJECPGjEGJWqOuhKCWBCmaKUsiEEJ8KIaTHI1kIsV0I0ctn137AUzkcSwohBmbzfEchxPdCiPNCCJMQ4pgQYokQop4QYqhPPQI9XhZC1PfYbh7gHDtdz72QvyuiKMGngpmiBMdmoIbr0R74HfhGCHFD5g5SyktSypT8nkAI0RhYCyQB3YDGwFDgKBADfOlRhxrA58B2n7K3PA75DzDC5xy3Ag2Ai/mtp6IUBV2oK6AoJZRFSnnG9f0ZIcQEYDTQAjgEzm5G4KCU8pF8nuMOIFVKOcaj7AiwwWM7I/MbIUSGT70yyyu7vv0EGCeEeEZKaXKVjcQZFG/PZx0VpUiolpmiBJkQwoCzxWPG2UIrLKeBCkKInoV0vA3ABeBeACFEWaA/MLOQjq8oQaNaZooSHLcJIVJd30cB6cBgKeWxQjzHYqA7sEIIcRn4BWdA+lxKeTwfx5PALJyBdwHwEHBYSrlDCFFIVVaU4FAtM0UJjp+AVq5HG+AVYK4Q4o7COoGU0uHqoqwJjAX2AY8C+4UQt+XzsHOA9kKIm3AGNdUqU4oFFcwUJTgypJQHXY8/pJRTgE3A84V9IinlGSnlQinlU0Aj4BgwMZ/HOg98C0wFmgDzC62iihJEKpgpStGx4exyDBoppQU4DFQtwGGm40z4WCylvFIoFVOUIFNjZooSHAYhRHXX99E4Mw/vIH8tprpCiFY+ZaeAvji7ML/CmSGpB+4CegKT81NpACnlD0KIKkBqjjsrSphQwUxRgqMTzmxDcKbHHwEmAO/k41ivuR6e/g9YA3TA2SVYE2e25GFgHPBRPs7jJqW8UJDXK0pRE2qlaUVRFKW4U2NmiqIoSrGngpmiKIpS7KlgpiiKohR7KpgpiqIoxV6Jy2ZMTk5WGS2KoiglXLly5bzmWFMtM0VRFKXYU8FMURRFKfZUMMtCUlJSqKtQLKnrlnfqmuWPum75U1KvmwpmiqIoSrGngpmiKIpS7JW4bMasSClJTU3F4XDkan+j0UhycnKQa1XyqOuWd8Xlmmk0GsqUKYNaqFMJR6UmmKWmphIREYHBYMjV/hERERiNxiDXquRR1y3viss1s1gspKamUrZs2VBXRVH8lJpuRofDketApiiKP4PBkOueDSU4xPnziJMnQ12NsFRqgpmiKEpxpvvmG8o2a0ZM06ZE/Oc/oa5O2FHBrAhVrFiRjh070qFDBx544AGuXMn/Ir7Nmzfn4sWL+X797NmzWbhwYb5fn0lKyZ133klKSgonTpygX79+3HrrrbRv356PP/7Yvd/ly5e55557aNOmDffcc4/7vR84cIDu3btTtWpVPvjgA69jT506lfbt29OhQweGDx+OyWQqcH19PfbYY3z77bd+5b1792bnzp2Ffr68ev31193X5YUXXmDjxo0hrpESKsYpUxBms/P7d99FHD0a2gqFGRXMilBkZCRbtmxh+/btVKhQgVmzZoWkHjabjWHDhjFgwIACH+v777+nWbNmxMTEoNPpePnll/n5559Zu3Yts2bN4q+//gLg3XffpUuXLvz+++906dKFd999F4AKFSrwxhtv8Pjjj3sd99SpU0yfPp0NGzawfft27HY7S5cuLXB9i7ORI0fy3nvvhboaSijY7Wj+/turSL9iRYgqE55KbTArV758to9q1avnuI/nI69uvfVWTp8+7d7+3//+R3x8PLGxsUyaNMld/uCDD9KlSxfat2/Pp59+muNxa9WqxfPPP0/nzp256667uHDBuWBw7969eeWVV+jVqxcff/yx1yf+w4cPc/fddxMXF0fnzp05cuRItnXytHjxYnr16gVA9erVadGiBQBly5alYcOG7ve4cuVKd/AcMGAAK1x/iFWqVKFNmzbodP65SHa7HZPJhM1mIyMjgxo1avjtM3fuXOLj44mLi2PQoEGkp6cDzhbXM888Q0JCAi1btnS3vqSUjB8/nnbt2nH//fe7r08gX375JQkJCXTo0IHffvsNgLS0NMaMGUN8fDydOnVyv4+ePXuye/du92vvuOMO9u7dy+XLl3nwwQeJjY2lW7du7N27F3C2uMaMGUPv3r259dZbmTZtmvu1b731Fm3btuXuu+/m4MGD7vK6dety6dIlzp49m2WdlZJJnD6NsNu9yvQrV4aoNuGp1AazULLb7WzcuJGePXsCsH79eg4dOsT69evZsmULu3btYuvWrYCzq23jxo1s2LCB6dOnc+nSpWyPnZaWRsuWLdm0aRNxcXG88cYb7ueSk5NZuXKlXytoxIgRPPLII2zdupXvv/+eatWqZVsnTzt27KBVq1Z+5ceOHWPPnj3cfPPNAJw7d47q1asDzqB3/vz5bN9HzZo1GTt2LM2aNeOmm24iJiaGrl27+u135513smHDBrZu3cpNN93E/Pnz3c+dPXuW1atX8+WXX/Lyyy8DsGzZMpKSkti2bRvvv/8+P/30U5Z1SE9P5/vvv+ett95i7NixALz99tt07tyZDRs2sGzZMl566SXS0tIYNGgQn3/+OQAHDx7EbDbTrFkzJk2aRIsWLdi2bRsvvvgio0aNch8/KSmJr776ilWrVvHGG29gtVr5448/+Oqrr9i0aRPz58/n999/96pTy5Yt2bFjR7bXTil5NCdO+JVpt29H5PD/oDRRwawIZWRk0LFjR6677jouX75MfHw84Axm69evp1OnTnTu3JkDBw5w6NAhAKZNm0ZcXBzdunXj5MmT7vKsaDQa+vXrB8ADDzzA9u3b3c/17dvXb/+rV69y+vRp7rzzTsB5z1NUVFS2dfJ05coVv1Tt1NRUBg8ezKRJk4iJicnDFfI+7sqVK9m1axd//fUXaWlpfPnll3777du3j549exIbG8uiRYvc3ZrgbI1qNBoaNWrkDp7btm0jMTERrVZLjRo16Ny5c5Z1SExMBCAuLo6rV69y5coV1q9fz3vvvUfHjh3p06cPZrOZEydOcM8997BmzRqsVisLFizgwQcfBJzBvn///gB06dKFy5cvu+8pS0hIICIigkqVKlGlShXOnTvHtm3b6N27N1FRUcTExLg/8GSqUqUKZ86cydc1VYovzfHjfmXC4UC3enUIahOeSs19ZuEgc8wsOTmZ/v37M3PmTEaNGoWUkqeeeoqHH37Ya//NmzezceNG1q5dS1RUFL17985zEoTnDa7R0dF+z0sZeMWcrOrkS6vV4nA40Gicn4usVitDhgzhvvvu46677nLvV7VqVc6cOUP16tU5c+YMVapUyfa4P/74I/Xq1aNy5cqAswX2888/88ADD3jtN3r0aD777DOaN2/OZ599xpYtW9zPRUREBHyfub3p13c/IQRSSubNm0eDBg389o+Pj2flypV8/fXX/Pjjj37n9T2uZ/20Wi02my3H+plMJiIjI3NVf6XkCNQyA2dXo9X1wam0K7Uts+QrV7J9nD1zJsd9PB95Ua5cOSZPnsyHH36I1Wrl9ttvZ8GCBaSmpgLO5Ifz58+TkpJCuXLliIqK4sCBA/z66685HtvhcLjHhxYvXkz79u2z3T8mJoaaNWuyfPlyAMxmM+np6VnWyVeDBg046sqqklLyr3/9i4YNG7q75TL17NnTnT25cOFC9zhbVmrXrs2vv/5Keno6Uko2btxIw4YN/fZLTU2levXqWK1WFi9enO0xAWJjY/nqq6+w2+2cOXOGzZs3Z7nv119/DcD27duJiYmhXLly3H777cyYMcMdpHbt2uXef/DgwTz77LO0adOGChUquM+3aNEiwPnhpGLFitm2VmNjY1m+fDkZGRlcvXqV1T6fvA8ePEjjxo1zfJ9KySICtMwAdOvXQ0ZGEdcmPKmWWYi0bNmSpk2bsnTpUvr378/ff/9NQkIC4GxBzZgxg27dujFnzhxiY2Np0KABbdu2zfG40dHR7N+/ny5duhATE8OcOXNyfM306dMZN24ckyZNQq/XM3fuXLp27RqwTr4tqoSEBLZs2cL111/Pjh07WLJkCU2aNKFjx44AvPTSSyQkJPCvf/2LoUOHMn/+fGrXrs3cuXMB57hWfHw8V69eRQjBxx9/zI4dO2jbti133XUXXbp0QafT0bx5c4YOHepX9+eff57bb7+dOnXq0KRJE3fwzcqdd97J5s2biY2N5YYbbiAuLi7LfcuXL09CQgJXr17lww8/BGD8+PH83//9H3FxcUgpqVu3rrv7s1WrVpQtW5aHHnrIfYz/+7//Y/To0cTGxhIVFeV1u0IgrVq1ol+/fnTq1Ik6derQoUMH93NWq5UjR47QunXrbI+hlDxZtcxEejq6jRux9ehRxDUKPyKrbqbiKquVppOTkylXrlyuj2MymYrFFEO+atWqxckinCHgzJkzjBo1im+++QYovtetMJw+fZo+ffrwyy+/uLtdcyO312zZsmXs2rWLF154oSDVLJC8/h0FU1JSUsDu3pKoTIcOaPfvD/icZdAgMnzu0cxOSbluaqVppVBVr16dIUOGkJKSEuqqhNTChQvp1q0bL774Yp4CWV7Y7Xa/7lulFJAyYAJIJt3q1eCTtl8aqZZZFkpzC6Mg1HXLu+J0zVTLLASuXKFc/fruTWk0gsGA8PgAmbpmDfZ27XJ1uJJy3VTLTFEUpRjR/POP17ajdm2srrHsTGo2EBXMFEVRwppv8oejTh1sPtnAOjUbiApmiqIo4cx3vEzWro21WzekXu8u0x48iObAgaKuWlhRwUxRFCWMBWqZERODrVMnr/LS3jorkmAmhJgthDgnhNjrUVZRCLFWCJHk+lrB5zW3CCHsQoh7PcqGuPZPEkIMKYq6h7NatWoBzpTwwYMHZ7vvRx995J6EN7c2b97sN+NGXt13330FWuom065du9xzSi5atIjY2FhiY2NJSEhgz5497v3WrVtH27Ztad26tXtmfoAZM2bQunVrypcv77V0TnJyMg888ABxcXG0b9+eBQsWFLiugWT+rDwdO3bM6z6yUMpcUshisdCzZ0/3bCRK6PneMO2oXRsAW+/eXuWlfdysqFpmnwK+d/VNAH6QUjYAfnBtAyCE0AJvAGs8yioCE4F2wK3ARN8AWBLY85FiW6NGDebNm5ftPh9//DEZRThTgJQSh8PB4sWLKZ+PVQV8vfPOO4wcORKAevXqsXLlSrZt28b48eMZN24c4Lx2//73v1myZAk//fQTS5Yscc/V2K5dO7755hvq1KnjddxZs2bRqFEjtm7dyvLly3nhhRewWCwFrm9xZTAY6NKlC1999VWoq6K4BGyZAVafeTu1v/6KKMUrKhRJMJNSbgJ8p3e+G5jr+n4ucI/Hc48DS4FzHmV3AGullJeklJeBtfgHyFwrX75cto/q1avluI/nIyfHjh3jlltuYdSoUcTGxjJ48GB3S6l58+a88cYb9OjRg2+++YYjR46QmJhIly5d6NmzJwdcfeFHjx6le/fuxMfH89///tfr2Jmf8O12Oy+88IK75TJ9+nSmTZvGmTNnuPPOO+nTpw/gnNy4e/fudO7cmSFDhrhnzli3bh233HILPXr0YNmyZQHfy2effcaAAQNITEykbdu2TJ482V2PTp068fTTT9O5c2dOnDjhtYjowoULiY2NJS4uzh2YLly4wKBBg4iPjyc+Pj7gjPBXr17lzz//pHnz5oAzMGUGyFtuuYVTp04B8Ntvv3H99ddTv359DAYDiYmJrHR1vbRs2ZJ69er5HVsIQWpqKlJKUlNTqVChQsDlaLJaiqdWrVq8+uqr7smgz507l+3PypfNZuPxxx/3+534448/6NWrF126dKFfv36cOXOGI0eOeE2MfOjQIbp06QLAxo0b6dSpE7GxsYwZMwazaxHH5s2bM2nSJDp37kxsbKz7d+nSpUv07duXTp06MW7cOK85JHv37p2rqcGUouE7ZpYZzGTNmtg8ZoMRUpbqiYdDOWZWTUp5GsD1tSqAEKIW0BeY5rN/LcDzp3rCVVZsJCUlMXToULZt20bZsmX55JNP3M8ZjUZWr15NYmIiTz75JFOmTGHjxo28+uqrPP300wBMmDCBYcOGsWHDBqpVqxbwHJ9++inHjh1j06ZNbNu2jfvvv59Ro0ZRvXp1li1bxvLly7l48SJvvvkm33zzDZs2baJ169ZMnToVk8nEk08+yRdffMGqVavc/5gD+f3335k5cyabN2/m22+/da/KfPDgQfr378/mzZupW7eue//9+/fz9ttvs2zZMrZu3epemmbChAmMHj2aDRs2MG/ePJ544gm/c+3cuTPL+Qjnz59Pt27dAGd3q2d3Xs2aNb3WjAtkxIgR/P333zRq1Ii4uDgmT54c8KbnrJbiSUtLo23btmzdupXY2Fj3NF25+VmB83di0KBBXr8TVquVZ555hnnz5rFx40YGDhzIq6++ynXXXUdMTIx73bTPPvuMBx98EJPJxOjRo5kzZw7btm3DZrN5/W5VqlSJTZs2MWzYMPcadpMnT6Z9+/Zs3ryZnj17csLj03+TJk38lp5RQsRsRuPR2pJCIGvWdG+rrsZrwnFuxveAZ6WUdp/ZwwNNJZ7tHd9JSUnu741Go9cs5VC4N37mNJu92WymVq1atGrVCpPJRN++fZk1axYjRoxASkmvXr0wmUykpaXx888/e42BWSwWTCYTP/30EzNnzsRkMnHPPfcwceJETCYTZrMZh8OByWRi/fr1DB48GJvNhs1mIzIyEpPJhJQSk8mEyWRi69atXvMuWiwW2rZty969e6lTpw61atXCbDbTt29f5s+f7/ferFYrnTp1IioqCoAePXqwefNmevToQe3atWnevLn7NZnn/eGHH+jduzfR0dHumd9NJhMbNmxgv8c0PSkpKVy4cIEyZcq4y06cOEGFChX86rFlyxbmzZvHt99+674OmQt6ZtbTc9uzPpllq1evpkmTJixevJijR49y//3306ZNG79lbT788ENWrVrlrs/+/fu5+eabMRgM3HbbbZhMJpo0acKmTZuy/VkF+p249dZbvX4nOnbsyL59+7j77rsBZ2u7WrVqmEwmBgwYwLx58/jPf/7D0qVLWbVqFX/++Sd16tShdu3amEwm7r33XubMmcOwYcOQUpKQkOCuX+a12rp1K7Nnz8ZkMtGlSxfKly/vdV30er3fzyHz55Pdh5yi5vk3XhJFHD9Oc49ta5UqJB075t42Nm1KM4/ntT/+yKFdu3C4/jazUlyvW3Y3e4cymJ0VQtSQUp4WQtTgWpdiW+ALVyCrDPQSQthwtsRu83h9beDH7E7g+caTk5ODOstCTseOiIhACOHeT6/Xo9VqMRqNCCGoWLEiRqMRi8VCuXLlAi6ECc5lZHQ6HRaLxX28iIgINBqN+1gRERF+9cnc12g0otfriY+P9/r0DrB79273cXzr6Emv16PT6dzlOp0OvV5PREQEUVFRXvtnnjdzH99jSSlZt25dtsualC1bFqvV6vXavXv3usfHaro+qdavX58zZ8649zt//jy1a9cOWJ/MssWLFzNu3DgiIyNp3Lgx9evX559//nEvKgrORJitW7eybt0691I8DofDfS0z6x4ZGYmU0n3sQD8rT5m/E4D7WFqtFoPBQOPGjVm7dq3ftUhMTOSdd94hPj6e1q1bU7NmTS5cuOB1fIPB4PX7EBMTg9FoJDIy0l3vQL8nntcl8/dQ75H+Dc5VFnzHHUOlpMxkkR2tqws9k6Z+fe/3fOON2OvXR+tauUJjsXDT0aPYXB+EAimp1y2U3YzfAZkZiUOAbwGklNdJKetLKesDS4DRUspvcCaDJAghKrgSPxLwSBDJqytXkrN9nDlzNsd9PB+5ceLECX7++WcAli5dGnB5lpiYGOrVq+eeuFdK6c7Wa9euHUuXLgXIckyja9euzJ49252NdvnyZcAZEK5evQo4x5l++uknDh8+DDhXVD548CANGzbkn3/+4ciRI+46ZuXHH3/k8uXLZGRksGLFihyXmunSpQtff/21u3sus15du3Zl5syZ7v0yu9A83XTTTe46ARw/fpxBgwYxffp0brzxRnd5mzZtOHToEEePHsVisbB06VK/xS191a5dm40bNwLO1bAPHjxIfY+pg4B8LcWTm58VOH8nMo+X+TvRoEEDLly44P5dsVqt7tar0Wika9euPP300+7Z+Rs2bMjx48fdP88vvvgi29UAwLnUTGa91q5d65VxeunSJSpXruwXyJSil9V4mZsQfjdQl9auxqJKzV8IbAduEkKcEEIMByYD3YUQSUB313aWpJSXgFeBX1yPV1xlxcZNN93kToK4fPkyw4cPD7jfjBkzmD9/vjtdPDOJYfLkycyaNYv4+PgsJ/YdPHgwtWvXJi4ujri4OPc/rMwFM/v06UPlypWZOnUqw4cPJzY2lm7dunHgwAGMRiPvvfce999/Pz169Mj2E3j79u159NFH6dSpE3fddVeOy5I0btyYp59+mt69exMXF8dzzz0HwBtvvMHOnTuJjY2lXbt2AZesadiwISkpKe5gPGXKFC5dusTTTz9Nx44due222wBnC/HNN98kMTGRW2+9lb59+7rH2qZNm0aTJk04deoUcXFx7jT/8ePH8/PPPxMbG8vdd9/Nyy+/TKVKlbzO361bN+x2O7Gxsbz22mu5WoonNz8rcP5OZN5qkPk7YTAYmDt3LhMnTiQuLo5OnTq5AxvA/fffjxCCrl27As4AN3XqVIYMGUJsbCwajYZhw4ZlW78JEyawbds2OnfuzPr166ntSvcGZ0u0e/fuOb5HJfgC3TDty+ozbqb7/nuwWoNar3CkJhrOQmFP/nrs2DH69+/P9u3bC+2YofLZZ5/xxx9/8Oabb/o9F6xJc6dOnUrZsmVzvJ+uOMrrNfvggw9ITk4O2lIwAwcOZOLEiQG7otREw0UrcswYDJ995t7OeOstLI884r2TzUbZhg3RXLr22T71u++we2S+eiop101NNKwUS5ktltLuoYceYuHChTz22GNBOb7FYqF3794l4p9dSeDXzRigZYZOh+2OO7yK9KVwNhDVMstCcVqWI5yo65Z3xemaqZZZ0SrTpg1a11gowNWtW3E0beq3n275cqIHDnRvO+rU4eru3SD8k8BLynVTLTNFUZTiwOHIcvYPX7b4eOc6Zy6a48fR7N0bcN+SSgUzRVGUMCTOn0d4TK0mY2IgJibwztHR2FyJUJlKW1djqQlmGo2mVM+5pygFZbFYAs6OogRHjmn5PqylPEU/HGcACYoyZcqQmpqa68l2U1JSiMnqU5CSJXXd8q64XDONRuM3I4gSPMK3izFQ8ocHW8+eSCEQrjwI7e7diOPHkWFyk3uwlZpgJoTwm6IoO+fOnQubmQ6KE3Xd8k5dMyUQv5aZx1yngcgqVbC3a4fOY7Ju/apVWFyTepd0qs9AURQlDOUqLd+Hb1djaVqwUwUzRVGUMOQ3+0cuWu++U1vptmyBQlgctzhQwUxRFCUM5adl5rjxRuw33eTeFjYb+gATVpdEKpgpiqKEIb8EkFyOq5bWrkYVzBRFUcLN1atoPLoHpV6PzGaRV09+s+ivXQuulcdLMhXMFEVRwozfzB+1akEu7/Gz33wzDo/AJ1JT0W3eXKj1C0cqmCmKooSZ/CR/XHuxBqvPOn6loatRBTNFUZQw49cyy0Xyhye/rsZVq8DhKHC9wpkKZoqiKGFG5HEqK1+2zp2R0dHubc3p02h37iyUuuWVOHuWiClTIMgrtKhgpiiKEmYK2jLDaMTWrZtXUSi6GrU7dlCmSxeMkyZh+PDDoJ5LBTNFUZQwk9eprALxm3i4KIOZlBimTSO6Tx80Z84AYHz5ZbRBTERRwUxRFCXM+LbMZF5bZoAtIQGp1bq3tfv3o/FY6DNo0tKIHDmSyAkTEDabu1jY7Rjmzg3aaVUwUxRFCSdWK+LUKa8iR61aeT6MrFABe2ysV5kuyMvCaA4dokz37hgWL/Z7zvTUU2RMnx68cwftyIqiKEqeiVOnEB6Zh44qVSAyMl/Hsvbu7bUdzK5G3YoVlImPR7tvn1e5jIkhbcECzC+9BB4txcKmgpmiKEoY8Uv+KMDyQL7jZtqffkJ3+XK+jxeQ3U7Eq68S/dBDiJQU76caNyZ1/XpsffoU7jkDUMFMURQljPjdMJ2P8TL3a+vWxd6smXtbOByUK8QkDHHxIlGJiRjfftvvOUtiIqnr1uG48cZCO192VDBTFEUJI4XZMgP/rsbymzYV6HiZtL//TpkuXdD/+KNXudTpyJg8mYxZs8DjXrdgU8FMURQljPil5Rc0mPl0Ncbs2AHp6fk/oJTo584lukcP/8BbrRppy5ZhGTUKhMj/OfJBV6RnUxRFUbLlt/RLAboZARwtWuCoXdsdeLRmM2VvvhnH9dfjqF/f+bjuOvf3slKlrANRRgaR48djWLDA7ylbhw6kz5mDrF69QPXNLxXMFEVRwkhht8wQAmvPnkTMnHntHKdPozl9GrZu9dtdli2Lo169a4HOFexkTAyR//432l27/F5jfuwxTK+8Anp9wepaACqYKYqihAsp/W+YLmgwA6z33+8VzLIjrl5Fu3cv2r17c9xXRkWR8cEHWBMTC1rFAlNjZoqiKGFCXLqE8BjPktHRyAoVCnxc+y23kDFlCo569ZCFNJZlv+EGUn/4ISwCGaiWmaIoStjwmy2/du1CS6SwjByJZeRIDu7dS8OICDRHjqA5etTvIXKRHGLt3Zv0jz6CcuUKpW6FQQUzRVGUMFHo42UByIgIHA0a4GjQIMCTEnH+vDOwBQh2CIF59B+4wpsAACAASURBVGgsY8YUebZiTlQwUxRFCRN+wayAmYx5JgSyalXsVativ/XWoj13AakxM0VRlDARjOSP0kIFM0VRlDBRFN2MJVWRBDMhxGwhxDkhxF6PsopCiLVCiCTX1wqu8oeEELtdj21CiJYer+khhPhbCHFQCDGhKOquKIpSVAr7hunSpKhaZp8CPXzKJgA/SCkbAD+4tgGOAF2klC2AV4EZAEIILTAV6Ak0AQYIIZoEv+qKoihFQ7XM8q9IgpmUchNwyaf4biBz2dG5wD2ufbdJKTPXKNgBZH40uRU4KKU8LKW0AF+4jqEoilL8ZWSguXDBvSm1WmSNGiGsUPESyjGzalLK0wCur1UD7DMcWOX6vhbg+bHlhKtMURSl2PNL/qhRA3Qq4Ty3wvZKCSHicQazjplFAXaT2R0jKSmpQHUo6OtLK3Xd8k5ds/wpSdct5qefKOuxnVa5ctDeX3G9bg0C3RvnEspgdlYIUUNKeVoIUQM4l/mEEKIFMAvoKaW86Co+AXh2INcGTmV3guzeeE6SkpIK9PrSSl23vFPXLH9K2nXTb9/utR3RsGFQ3l9Ju26ZQtnN+B0wxPX9EOBbACFEXeArYJCU8oDH/r8ADYQQ1wkhDEB/1zEURVGKvZDfMF3MFUnLTAixELgNqCyEOAFMBCYDi4QQw4F/gPtcu78EVAI+Es7pUmxSyrZSSpsQYiywBtACs6WUfxZF/RVFUYLNN5ipG6bzpkiCmZRyQBZP3R5g30eAR7I4zkpgZSFWTVEUJSz4rdqsWmZ5omYAURRFCQPqHrOCUcFMURQl1Ox2xMmTXkWqZZY3KpgpiqKEmDh7FmGzubcdFSpAmTIhrFHxE7b3mSmKopQWJS35IzUVDh/WuB5aDh3S0LWrjcREa9DOqYKZoihKiBXH5I+0tGsB69Ahreurc/vsWf9OP50OFcwURVFKMhHmyR92OyxapGfbNp07YJ05k7dRqkOHgjuqpYKZoihKiIV7y+zll4188EFEgY5x+LAKZoqiKCWaX1p+3bohqom/ffs0TJ1qyNNrtFpJvXoObrjBwfXXOx833ugIUg2dVDBTFEUJMb8EkDBpmUkJzz9vxOHwn+ddq5XUresdsG64wfmoU8eBXl+0dVXBTFEUJcT8uhnDZMxszRodGzZ4R6XXX88gIcFG3bpFH7Cyo4KZoihKKCUnI1JS3JsyIgJZpUoIK+RkscALLxi9yjp3tjFqlAURaEGuEFM3TSuKooRQwNnywyBazJpl4OBBrXtbo5FMmpQRDlULSAUzRVGUEArHORkvXhS88YZ3q2zwYAvNmgU3iaMgVDBTFEUJId/xsnBI/pg8OYLk5GtNsJgYyfPPm0NYo5ypYKYoihJC4dYy279fw+zZ3qn448ebqFJFhqhGuaOCmaIoSgiJMLphWkp47jkjdvu1Vtl119kZOdISsjrllgpmiqIoIRROLbPvv/dPxX/1VRMRBZv8o0ioYKYoihJCfmNmIQpmVqvzBmlPnTrZ6N3blsUrwosKZoqiKKFisSDOnHFvSiFw1KwZkqoUt1R8XyqYKYqihIg4dQohryVWyGrVCEWf3sWLgsmT/VPxmzcP31R8XyqYKYqihIjmn3+8tkM1Xuabil+2bPin4vtSwUxRFCVEwmFOxuKaiu8rT8FMCNFdCPGJEGKZa7utEKJrcKqmKIpSsoV6tvzMWfF9U/EffTT8U/F95TqYCSEeBz4GkoDOruIM4L9BqJeiKEqJF+q0/LVrdaxfXzxT8X3lpWU2DugmpZwMZI4K/gXcVOi1UhRFKQVCecN0cU/F95WXYFYWyPwYkdmZqgeKX3tUURQlDISyZTZrloGkpGup+EIUr1R8X3kJZpuACT5lTwAbCq86iqIopYSU/gkgRdQyu3QpUCq+tVil4vvKy+KcjwPLhBAjgLJCiL+BFODOoNRMURSlBBPnzyPM19LfZUwMlC9fJOd+/fVAqfimIjl3sOQ6mEkpTwshbgFuAerh7HL8WUpZfEO5oihKiISqVXb4sDFgKn7VqsUrFd9XroOZEKIVcFFK+TPws6usjhCiopRyV7AqqCiKUhKJEI2XvfdeHa9U/Pr1i2cqvq+8jJktwJnw4ckAzC+86iiKopQOoUj++P57Hdu3l/MqK66p+L7yEszqSikPexZIKQ8B9Qu1RoqiKKWAXzALcjdjoFT8jh1t9OlTPFPxfeUlmJ0QQrTxLHBtnyrcKimKopR8Rb30yyef+Kfiv/568U3F95WXbMZ3gW+FEFOAQ8ANwL+B14JRMUVRlJKsKFtmV644JxP2VNxT8X3lumUmpZwJPAX0Bt50fX1aSjkjp9cKIWYLIc4JIfZ6lFUUQqwVQiS5vlZwlQshxP+EEAeFELs9W4NCiCGu/ZOEEEPy8D4VRVHCSlEmgKxapefKlWv/7ktCKr6vPE00LKVcLKXsIaVs6vq6JJcv/RTo4VM2AfhBStkA+IFrN2T3BBq4HiNxzgeJEKIiMBFoB9wKTMwMgIqiKMVKaiqay5fdm1Knc65lFiS//qr12h42zFLsU/F9ZdvNKIQYJKWc7/p+WFb7SSlnZ3ccKeUmIUR9n+K7gdtc388FfgSedZXPk1JKYIcQorwQooZr37VSykuu+qzFGSAXZnduRVGUcOM3XlarFmi1WexdcL/+6v2vPja2ZCR9eMppzGwA11LvB2WxjwSyDWZZqCalPA3uG7KrusprcW0OSIATrrKsyrOUlJSUj2oV3utLK3Xd8k5ds/wprtct5qefKOuxnVapUtDei8kk2Lu3tVdZhQpJJCUVv4DWoEGDLJ/LNphJKXuBcxwLGA78I6UM9hUIlFsjsynPUnZvPCdJSUkFen1ppa5b3qlrlj/F+boZtmzx2o5o2DBo7+Wnn7TY7ddGlGrWNHPrrdcF5VyhlKsxM1eX3x6uLf1SGM66ug9xfT3nKj8BeI6E1saZ/p9VuaIoSrFSlEu/+I6XNWuWGrRzhVJeEkB2Ag0L8dzfAZkZiUOAbz3KB7uyGtsDya7uyDVAghCigivxI8FVpiiKUqz4peXXrRu0c/32m3cwa9o0LWjnCqW83Gf2I7BaCPEpzrErdxdfTgkgQoiFOBM4KgshTuDMSpwMLBJCDAf+Ae5z7b4S6AUcBNKBh13nuCSEeBX4xbXfK5nJIIoSEg4Huu+/R79yJY6qVbEMHowM4j8lpeTwDWbBvGHaN/mjWbM0oFzgnYuxvASzOOAI0MWnPMcEECnlgCyeuj3AvhIYk8VxZud0LkUJuitXMCxYgGHWLLRHj7qLI959F2vfvpjHjsXRqlXR1MXhgNRUhMkE6emIjAxERob7+4BlmdsZGaDRYO3XD3tcXNHUVwGK7obp8+cF//xzrQNOp5M0bJgelHOFWo7BTAgRBbwApAK/A5OklObsX6UoJY9m/34MM2Zg+PJLRLr/PwRht2NYsgTDkiXYOnfG/MQT2G6/nUKfL8hkQvf99xiWLkW3dm3AuuSFYfZs0j/9FNvddxdSBZVs2WyI06e9ioIVzHy7GJs1s2M0lqz7yzLlpmX2Ic41zFYBiUBFnAt1KkrJZ7ejW7WKiBkz0G3alOuX6TZtQrdpE/YmTTCPHYv13nvBYMj5hVmx2dBt2oR+yRL0y5cjUlLyfywfQkqiHnmE9JgYbPHxhXZcJTBx+jTCbndvOypXhsjIoJzLN/mjbVt7FnsWf7lJAOkJJEgpn3F93ye4VVKU0BOXLmF4/33KtmpF9MCBWQYyaTBgSUzEftNNAZ/X7ttH1OjRlG3ZEsP770Nycu4rISXan3/GOH48ZRs3JrpfPwyff16ogSyTsFqJGjgQ7a+/FvqxFW9FufTL7797B7Obby65wSw3LbNoj5ubjwshSt7IoaK4aPbsIWLGDPSLFzvHobLgqFEDy7BhWIYORVap4kwGWbuWiP/9D93Wrf7HPX2ayIkTMb71FpbBgzE/9hgyi64lzZ9/ol+yBMPSpWj++SfHOsuoKGR0NERGIl0PIiORUVHeX43Ga99HRiIuX8b4zjvu44i0NKLuu4+0lStxNG6ci6ul5Iff7B9B6mJ0OOC337z/xZf2YKYTQsRz7aZl322klOuDUTlFKRI2G7oVK4iYNg3d9u3Z79qhA5aRI7H26QN6j7VqNRpsd9yB7Y470P7+O4YPPkD/7bcIh/etmeLqVSKmTsUwfTrWfv0wP/44GI2Io0cxLF2KfskStPv351hlR9WqWO+5B+t992Fv2zbf43KycmUin3vu2tu4fJnofv1IXb0aWa9evo6pZK+oWmaHDmlITr72exETI7nxRgeHDgXldCGXm2B2Du8Mwos+2xK4vjArpShFIi0Nw7x5REyd6vdp2ZM0GrHeey/mkSNxtGiR42HtbdqQMWcOpqNHifjoIwwLFvglaQibDcOiRRgWLaJZnToYff7BBaxHTAzWO+/Eeu+92Dp1Al1ekpEDs4wejbh0CeNbb7nLNKdPE923L2mrVyOrVs3m1Up+FNUN077jZTffbEOTp6nli5cc/xqklPWLoB6KUmTEpUvOrMQZM9BcyvpWRUft2pgfeQTr4MHIihXzfB5Zvz6mKVMwT5iAYfZsDNOnozl/3m+/7AKZNBqx9uiBNTERW/fuYDRmuW9+mZ9/HnHlChGzZrnLtIcPE52YSOry5VBOjSwUpqJqmZWm8TLI231milKsiZMnnV18c+ci0rKeBcHWqRPmkSOx9exZKK0fWbEi5n//G/PYsegXLSLigw/QZjOprNRqsXXtijUxEWuvXhATU+A6ZEsITFOmIC5fxrB0qbtYu2cP0f37k7Z0KURFBbcOpYhvL0Cwgpl/y0wFM0Up1jRJSUS8/z76L79EWK0B95FGI5YBA7CMGIGjSZPgVMRoxDp4MNaBA9GtWeNMFvEYo7N16ID13nux3n03snLl4NQhKxoNGR9/jEhORr9unbtYt307UQ8/TPqCBd5jhEr+SFkks3+YTLB3b+lJywcVzJQSTLtzJxHvvotu2TKEDHyjqCxXDvOIEVgefdSZlVgUNBpsPXti69kTze7dnN+0icp33x3UKY1yxWAgfd48ovv2RffTT+5i/Zo1RI4ZQ8a0aZToQZciIK5c8eoVkFFR+erCzsnu3Vqs1mvJH3XrOqhSpWTeLJ1JBTOlZJES7aZNGN95B93GjVnu5qheHfOYMViGDAl+N142HC1acCkykkqhDmSZoqJI+/JLyvTqhXbfPnexYdEiZIUKmCZPLvwZTUoR4XOrhaN27aBcT9+ZP26+ufitXZZXKpgpJYPDgW7ZMiLeew/dzp1Z7ma//nrMTz6J9YEHgpJMUSKUL0/aV18R3aOH99yT06c7x/+efbZgx5cSzZ9/ojl0CFmnDvamTSEiomDHLCaKarzMP5iV7C5GUMFMKQG0P/5I5Pjx2SZV2Fu0wPyvf2G9666gLk9fUsjq1Un75hvK3HEHmrNn3eXG119HVqiAZeTIvB0wNRXdxo3o1q5Fv3YtmpMnr51Lr8fRpAm21q2xt2mDvVUr503bJXCMzm+8rIjS8kv6eBmoYKYUc9qtW4m+916ELXA3iq1jR8xPPeWcc1B1j+WJrF+ftK++okyvXgiPabgin3kGWaEC1vvuy+bVoDlyBN2aNei+/x7dli0IiyXgfsJqRbtrF9pdu+DTT53njojA3rw59tat3Q9Hw4bF/oNIUaTlX7woOHr02nXSaiUtW6pgpihhS5w8SdTQoQEDmbV3b8zjxmG/5ZYQ1KzkcDRtStqiRUTfc49z2RiXyMceQ5Yrhy0h4drOFgva7dvRuwKY9uDBfJ9XmM3ofv0VncdckTI6GnuLFu7gpq9eHRo0yPc5QsGvmzEILTP/xTgdwZrHOKyoYKYUT2YzUUOG+N2EbOnfH/O4cTgaNQpRxUoee7t2pM+fT9SAAe5bG4TNRtTgwaTPno24eBH999+j+/FHxNWruTqmjIrC3qYNmmPH/ForWRFpaei2b3ffztBCo8H0+utYHn00f28sBEQRtMz8uxhLfvIHqGCmFFORzzzj9akdwDR+PObnnw9RjUo2W7duZEyfTuTw4e7bHITJRPSDD+b6GPb69bElJDjnsIyLcyfgiAsX0P7xB9qdO90Pjc96X4EIhwPjSy9hve++oKS3B0MoWmalIfkDVDBTiiH93LkY5s71KrMmJGD+v/8LUY1KB2u/fogrV4h86qlc7S91OuyxsVgTErAlJOBo0CDguKWsXBlbt27YunVzl4nTp70D3O+/o7l40e+1wmxGv2ABlieeyP8bKyomE5pz59ybUqNB1qxZqKeQ0j+YlYbkD1DBTClmtL/8QuT48V5l9uuuI33GDHVDbxGwDBvmnJj4v/8N+LyjalVs3bs7A1h8fL7v4ZM1amCrUcM5pRiAlIgTJ9Du3OlcXeDbb937RsyahWXMmLBPDvHM4AScgayQMzYPH9Zw5cq1v4OYGEmDBo5sXlFyqGCmFBvi7FmiBg/2yoqTUVGkf/YZlC8fwpqVLuannwa7nYg33wS7HXubNs7uw4QE7C1bBudDhRDIOnWw1amDPS4O3erVCLMZAM0//6BbuxZbjx6Ff95C5DdeFoQuRt/xstat7aXmM54KZkrxYLUSNXSo31hKxtSpwZtLUQlMCMzPPot51Chnt2ERz6AiK1XCmpiI4fPP3WWGWbPCPpjp13sv+6iSPwpXKYnZSnFnfP55v4UzzU88gbVv3xDVSKFcuZBNBWYZMcJrW79uHZowXnVSs3cvhqlTvcrsrVoV+nlK27IvnlQwU8Ke/osviJgxw6vM1qULppdeClGNlFCzt25NarNmXmWGTz4JUW1yYLcTOW4cwn4tsDhq1sQyaFChnsZshj17VDBTlIK5cgX9l18S/eefzpSqQqL54w8ix43zKnPUqUP67NmFstaYUnyd85mBxLBgAWSzTl2oGGbP9ruNJGPKlEJv1e7Zo8ViuZYtWru2g2rVSvZM+Z5UMFMKTLtpE2Vbtybq0UdpPHQo0Xfdhdbnjzc/xMWLRA8ahDCZ3GXSaCRt/nxkpUoFPr5SvF2+/XYcHr8HIiUF/ZIlIayRP3HqFMZXXvEqs/bpg61Pn0I/l39KfukZLwMVzJQCMnzyCdH9+qG5fNldptu8mTLduhE1cCCav//O34FtNqKGDfObHSLj3XdxBGGsIRSOHhVMm2bg3Xdr89FHBjZs0HH6tCjMhm2JJiMinEv4eIiYObNQewYKKvKZZ7xmRZFlyzpbZUFQWm+WzqT6aZT8sVoxPvssEbNnZ7mLfvlydCtXYh0wANOECXlafNL4yit+65GZR4zAOmBAvqscalLCnj0aVqzQs2KF3mMlYO+J88qVkzRubKdRIzuNGjlc3zuoWlWquZJ9WB5+mIj33kM4nPdSaffuRbtjB/YOHUJcM9AtX45++XKvMtOLLxb6jdKZfDMZS1swEzKMPsUUhuTk5EJ5Q0lJSTQoZpOYFhVx8SJRgwej27o116+RBgOWRx7B/PTTOXYR6r/+mqiHH/Yqs3XoQNp33xW7ZUFsNti+XesOYMeP578zpEIFh1dwa9TITuPGJX8F4axk/o1GPfgg+pUr3eWWxEQyQp0MkpJC2fbt0Zw65S6ytW1L2po1Qbm5+9IlwfXXXxuD02olx4+nEBXlv29J+d9Wrlw5r492qmWm5Ilm3z6iBwxAc+yYV7ksU4b06dM5kZzMDZ98gu6337yeFxYLER99hGH+fMxjx2IeMwbKlAl4/MixY73KHDVqkP7pp8UmkKWnw/r1Olas0LN6tY7LlwunN//yZQ3bt2vYvt37zzYmRlKrloNatRzUrCmpWdNBzZoOatW69n1MTMldAcc8cqRXMNN/+y2m115DVq8esjoZ//tfr0AmdToy3nsvaLOU+KbkN2niCBjISjIVzJRc061YQdSjjyJSU73KHfXqkfb55ziaNuVqUhJpAwagW74c46uvoj1wwGtfcfUqxtdfxzBzJubx47EMHXptleErV4gaOBDhkZEm9XrS581DVqsW7LdXIBcvClavdgawDRt0ZGTkHDk0Gkn79nYaNz5HRkZl/vpLw99/a0lLy1vUSUkRpKRo2b8/63+UZcpcC2yZAa9WLUmNGs7uy0qVHFSuLImOztOpw4K9SxfsDRq4F2cVNhuGuXMLviJ2Pml/+w3DzJleZeaxY3H43EpQmPy7GEtX8geoYKbkhpREvP12wPn4bB07kj53rnfXoRDY7ryT1J490X/xBcbJk/1mC9dcuEDks88SMXUqpueew5qYSNTIkWgPH/baL+PNN8N2TbL0dPjqKz0LFxrYvl2Lw5FzEDIaJfHxNnr3ttKjh43KlSVJSado0MAZRRwOOH5c8NdfWv76S8P+/c4gdeCAJlcBMiupqYIDB7QcOJB9yyAqSlKpkqRKFWdwu/a4tl2lyrXgFxaf/oXA8sgjRHoEL8Onn2J+6qmib81brUQ+8YR7ZQFwrhZgfuaZoJ62tCd/gApmSk7S04kcOxbDV1/5PWUeNgzTG29k/Q9Dp8M6cCDWe+/FMGsWEe+8g+bSJa9dNP/8Q9SoUTheeslrRnEAy+DBWIcOLax3Umj+/lvDnDkGFi40kJycc4ApX95Bjx7OANa1qy3b1o9GA/XqSerVs3HHHdfKHQ44dkzD/v0ar0B34IAGs7nw+g/T0wXp6SLXY3vXXWfniScsDBpkCeltf5b+/TG+8oq7Va85fRrdihXY7rmnSOth+OgjtH/+6VVmevddghn1S/NM+Z5UAkgWSsogaUGIkyeJeughdH/84VUutVpMU6ZgGT7c7zXZXrfkZCI+/JCIjz7y6koMxHbzzaStXHmtCzLEzGZYvlzP7NkGtm7N+b927doOeve20ru3ldhYe7b/6Avyu+ZwwIULglOnBCdPajh1SuP3/alTGkym4A6YNWli57XXTMTHF133lu91Mz71lFd2rS0ujrQVK4qsPuLoUcp26OC1Irfl/vvJ8Jm9prAdOaKhdeuy7u2yZSVHj6ZkOTxXUv63qQQQJVe0v/xC1EMP+bWWHBUqkD53LvbOnfN+0HLlMD//PJYRI4h46y0Mc+a4Vy72OkeVKqTPmxcWgezoUcHcuQbmzzdw4UL2rZWmTe3uANaihaNIEi40GqhaVVK1qqRVq8BLfUgJly8LTp4UrgCncX9/+rTgwgUNFy8KLlwQXjNI5MW+fVr69o3mjjus/Pe/ppAsO2J55BGvYKbbuhXNn3/iaNo0+CeXksinnvIKZI4KFTC99lrQT+07XtaqlT3cV8MJipAHMyHEk8AIQAAzpZTvCSFaAdMAI2ADRkspfxZCCOB9oBeQDgyVUv4eoqqXWPrPP3fOJeex1AqAvXFj0hYuRNavX6Djy6pVMU2Zgnn0aIyvv45+0SL3GIPUakmfMwdZq1aBzlEQNhusWaNjzhwDP/ygQ8qs/8FXquRg4EArgwdbuOGG8Fw3SgioWFFSsaKkefOs6yglpKTAxYsazp93BjfnQ+PxveD8eWfwO3dOYLd7X5s1a/T88IOORx6x8OyzZipUKLqeH0eTJtji4rxuGTF88gmmd94J+rn1S5b4zYpvevVVZJUqQT93aZ4p31NIg5kQohnOQHYrYAFWCyFWAFOA/0gpVwkherm2bwN6Ag1cj3bAx66vSmGw2zFOnEjEhx/6PWXt0cO5AGYhzicn69cnY/p0zE88QcQHH6A5dQrz2LHYO3YstHPkxalTgvnzDcybZ+DkyexbYbGxNoYNs3DnndZwaEAWCiGcE+GXK+fg+utz3v/kScErrxj58kuDV7nNJpg2LYIvvtAzYYKZ4cMtRZaHYR450juYffklpokTnW8sSMTlyxh9Vjm3deyI9aGHgnZOT6V5pnxPoZ7OqjGwQ0qZLqW0ARuBvoAEMv9rlgMyb9i4G5gnnXYA5YUQNYq60iVSSgpR/fsHDGSmp54i/fPPg7bch6NpUzKmTSPtu++wJSQE5RxZkRI2btQycGAUzZuX5fXXjVkGspgYyciRZrZvv8rKlWnce2/JCWT5UauWZPr0DH74IZV27fxbA1euaJgwIZLY2DKsWaMrklmmbL164ahx7V+CSEvDsHBhUM9pfPFFNBcuuLdlRITznrIi6Ge2WGD3bpX8ASFOABFCNAa+BToAGcAPwK/AR8AanF2PGiBWSnlMCLEcmCyl3OJ6/Q/As1JK96y2ngkgSa77TpTsCauVBo8/TozPjc6OiAiOvvACl8J80cP8kBI2bSrH7Nk12bcv+5urmjRJIzHxHN27XyYyMjy7EkNNSli3rgIffFCb06cDR/h27ZIZN+44N95oCvh8Yakxcya1PJIuTHXrsnfx4qCsgF3mt99oNGqUV9nJRx/l9COPFPq5AvnzzyiGDr22OG3VqhZWrNhdJOcOBc/EFd8EkJBnMwohhgNjgFRgH86gpgU2SimXCiHuB0ZKKbu5uiBf9wlmz0gp3f+FVTZjHknpTL3/7DOvYkeNGqR/9hn2Nm3ydLhwv252O3z3nZ633orgzz+zHiWPipLcd5+Vhx82Z5lYUVjC/ZrlhckEH38cwdtvR5Ca6t8y0WgkQ4daeO45M5UrF+xPNavrJs6epWyzZl7JRWlff40tPr5A5/NjMlGmUyf3zdoA9ptuInXzZjAYsnlh4Zkxw8Azz1yb2/Ouu6zMm5ee7WtKyu+bbzALdTcjUspPpJRtpJSdgUtAEjAEyLyxaTHOMTWAE4DnbLW1udYFqeSD4f33/QKZrVUrUtevz3MgC2c2GyxcqKd9+zI8/HBUloGsSRM7b76Zwf79Kbz/fkbQA1lJYzTCv/5l5rffrjJ4sAUhvAOWwyGYPTuCNm3K8r//GTAFoZEmq1XDetddXmW+M3IUhoh33vEKZICze7GIAhmoZV88hTyYCSGqur7WBfoBC3EGqC6uXbriDHAA3wGDhVN7IFlKebqIq1xi6L77jsiXX/Yqs9evT/rSpcgaJWMo0myGZ2hkBQAAGq1JREFUuXP13HxzWR57LIqkpMBBrHdvK6tWpbJ1ayojRliCmS9QKlSrJvnf/zLYtCmVTp38/8GmpAheeimS66+PoW/fKN55J4JfftES4E6NfLGMGOG1rVu9GvHPP4VzcEDz999EvPuuV5l56NAin61fzfxxTchT84GlQohKgBUYI6W8LIQYAbwvhNABJmCka9+VONPyD+JMzX840AGVnGl37iTq0Ue9ymRMDOmLFpWIhS8zMmDePAP/+19ElgkdQkj69bPy1FNmmjZVLbBgaN7cwXffpbFypY4XXzRy+LD3P9/0dMGGDXo2bHCmO5YpI2nf3kanTjY6dbLTokX2N5xnxd6uHfZmzdDu3QuAcDgwzJmDeeLEAr8nHA7nrSsekddRtSomnw+GwXblChw8eO16ajSSli1VMAsZKWWnAGVbgJsDlEuc42tKAYgTJ4gaMMDrBk+p05E2fz6Ohg1DWLOCS02FOXMMfPBBBOfOBQ5iWq3k/vudQSwUN/eWNkJA7942undPZeZMA2+8YSQlJXCmX2qqYN06PevWOYNbTIykQwcbHTs6A1zz5o7c3RAsBOYRI4h68kl3kWHePOfkw0Zjgd6Pfv58dNu3e5WZ3ngDypcv0HHz6rffvP99N27sCLQQRakR8mCmFLHUVKL790dz5oxXccbbb2Pv0iWLF4W/K1dg5swIPvrIkOWSKwaD5KGHLDz5pJn69UvWNG7FgcEAY8ZY6N/fyttvR/D113pOn85+pCMlRbBmjZ41a5zBrVw5SVycM7jVqRNFvXpZD1FZ770X+dJLiORkADQXL6L/+usCLfAqzp4l8qWXvM+TkIC1iOeABDUfoy8VzEoTu52o4cPdXS+ZzGPHYvVZfj6cSQmnTwt27dK6H1u36rL8tG80OjPoHn/cTK1aKoiFWqVKkkmTTLz2molDhzRs3qxj82YtW7bosmxNZ0pOFqxcqWflSj3QBL1e0qiRgxYtnF2SzZvbadbM7rwlMjoay0MPEfHRR+7XG2bNyl8ws9vRL16McdIkd3AEkFFRZLz5ZkgWi/MfLyu9yR+gglmpYnzxRfRr1niVWXv2xPSf/4SoRjmTEo4dcwau3buvBa/z53POXSpTRjJ8uIUxY8xUraqCWLgRAm680cGNN1p4+GHnz/rvvzVs2aJj82YdW7ZouXgx+5+z1SrYs0fLnj1aPJNyr7/eTvPmDlrWfo72HKYVf1CDM+h++w3t77/nPlNXSnSrVzvX5tu3z+9p03PPIevVy8vbLhRSBlrDTLXMlFLAMGeO1ydUAHuLFqTPnBm01W/zyuGAw4c1Xi2uXbs0XLmSt6TbmBjJqFFmRo2yULGiCmLFhRDQqJGDRo0sPPKIBYcD9u/PbLnp2LpVm+vfhcOHtRw+rOVbagGrAKjGGVqzk+ZjUmj6rI477rARGZn1MbTbt2P8z3/Q7dgR8Hlbu3ZYfG6YLirHjgmvQF+mjLOFWpqpYFYK6DZswPjvf3uVOWrUIO2LLwiHEeOTJwUTJxpZvVof8Ebb3Kpc2cHo0RaGDzer1PoSQKOBpk0dNG1qYdQoZ3Dbs8fZctuyRcdvv0nOncv9PV1nqc5qerJ6PzAU6tRxsHBhGs2aeQcBzd69GF991a8XI5PU67EMHYrppZcI1SJuvskfpXWmfE8qmJVwmr//JmrIEIT9WheEjIpyzn5fs2YIa+Z04ICGfv2iOXEib62vyEhJ8+Z2WrZ0jpW0bGmncWNHkS8srBQdjQZatnTQsqWFMWMsJCUlUaFCQ/bs0bJ7t8b1VUtSkibblQ4yHT+u4YEHolm3LpUaNSTi6FGMkyahX7zYa6XoTFIIrPfd5+xaLODKEQWluhj9qWBWgokLF4i+/35ESoq7TApB+owZOFq1CmHNnHbu1HLvvVE5jouULXstcGU+GjRwhHRlYyU8VK4siY+34TlTVVqac3213budjz17NOzbLTHZ/D/pnDypof+9Btbf8m8qfDYj4Pp6ANY77uD/27vz6KbK9IHj3ydpuqStbCpCEZCfdISRWviBFFHRnzAiChUcFRHxyDIgoMKIo6iDwhw6KAIOioIC4rDqiAiDK3VBjwO4MJVFzogiyqJ2kK1ttiZ5f38k0F6SAmLbNOH5nMNp8mZ7crk3z33f+y6eP/+Z4IUX1tRX+UW080ck/TlIVF4vzoEDsX33naXYM3Ei/uuui1FQFT780M6AAekRzYr16wfJzQ2Ez8BDieu884I1MUesSlDp6dCpU4BOnSpqK4Hi/ey98AaKfG15lX6soN/Rx77YmsodW3vwKs9ybEudPy8Pz4QJBC65pJaiP7HycvjiC+2WfyxNZonIGNLuuiviwrVv0CB8d90Vo6AqrF6dxJAhTrxeayIbNMjHjBnu077tX1U/+9kNyb6xLRcuXkx/lpHPSt7g2qOPryKfcTzBDP4IQKBtWzwTJuC/+uqYdLs/nq1bbZZjp2nTIE2bakcnPd9NQCmPP07yyy9byvyXX4572rSYH5iLFzsYNCgykY0Z4+Fvf9NEpmqONzxfYxIBltGfiyiyPP4kY3m6wcO4Zs+m9KOP8PfsGfPjJZrPPrPWQTp00FoZaDJLOI7ly0n9618tZYHWrSn7+9+Jde+Ip59OZtQoJ8Gg9Qdi0iQ3jz7qrYu/GyqBBHNz8XfqBEAmpazmOpqyx/Kcew5N4vWGA+vMcJVoju38cTrPlF+ZJrMEYv/kE9JGjrSUBRs0wPXSS7U+b1xlxsCkSSk8/LB1UI/NZnjqKRd33+2LUWTqdOMdPfro7Wbs4Z/Om0l3eI+WBYPC4MFONm2quz+NGzdqT8Zo6u7/mPpF5Mcfcd56K+KtODCNw4Fr0SKCrVrFLK5AAMaOTWX6dOvkrsnJhgULXNx2WzWt+aHUSfDn5+OeMgX/5Zfj+eMfOX/Ti8xb6Mdmq7jmVFoq9O+fzt69da+p4OBB+Oor60z57dtrMgNNZokh3OHD9t//WordM2cS6No1RkGBzwdDhqSxYEGKpTwjw/CPf5TRp482j6ja5xsxgrJVq/BOmIA580x69vQzZYp1ldC9e0Nj0EpLYxRkFf79b+v1sgsuOL1nyq9Mk1kCSF6wAMeaNZYyz733/qrZwX+t0lLo39/Ja69ZZ2ho2DC0vlW3bno2qeqOP/zBx/DhXkvZ5s12hgxxEqhDu6oOlq6aJrM4Z9uxg9SHHrKU+bt0wfvggzGKCA4cEPr2Tee996wdTrKygrz5Zpn2vlJ1UkGBh549rc3eb7/tYPz4X7f+WXWKXPZFWzeO0GQWzwIB0u68E3G5jhaZjAxczz4bs95YxcUOevVK59NPrc0h558f4K23SvnNb07vyVBV3WW3w9y5LnJyrCdbzz2XwuzZJz8HZE0xJtrMH3pieIQmsziWMnMmSRs2WMrcBQUxmzduxw4bw4ZdwLZt1gPuoosCvPlmGeeeqwM7Vd2WkQEvvVRGVpb1pGv8+FTeeCO2c0x8/71Ylj5yOnWm/Mo0mcUp26ZNpBQUWMrKr76a8ttui0k8mzfb6Nkznb17rZ09unb1889/lnLWWZrIVHxo0sSwbFkZGRkV+6wxwtChToqKYveTuXFj5Ez5Oj9pBU1m8cjjwTlihGVS1GDDhrhnzozJjAWFhUn06pURsUrwNdeUs3x5WWjVX6XiSLt2QV54wWXpsu9yhbrs794dmy77kYOltYmxMk1mcSi1oCBi1Vv3jBmYxo1rPZa5c5O56SYnJSXWA/yWW3wsXOgite5cO1fqF+nRw8/UqdYu+z/+GOqyX1JSe3EEAjB7djILFliv2+lM+VaazOKM/eOPSX7qKUuZ7+ab8efn12ocgQDcf38q48alRUxPNXKkl1mz3NoEouLekCE+Ro2ydtnfutXO4MFO/LWQS7ZssfG736XzwANplJVZjzOtmVlpMosnJSU477zTsnBgsFkz3I89VtthcMstTubMsV4fEzGMHbuLyZM9umSLShiTJnm49lprl/01axz07p3O++8nEWUdz1/N7Q5NAXfFFRkRq0pDqOUjK0uvQ1emPzlxJO3BB7F9/72lzDVrVq3Ou7hrl3D11Rm88451DFl6umHJEhcDBvykEwarhGK3w3PPuWjf3loVW7cuib5907nyynRWrUoiWE0dC9eutdO1awbTp6fi91sPpjPOMMyY4WbWLHf1fFgC0WQWJ5LefJPkhQstZd4RIwh061ZrMXz+uZ2rrsrgyy+tF6JDg6FLueYabcNXiSk9HZYtc9GsWWTGKipKYtCgdPLyMliyxEEVi1Wf0P79wqhRaeTnZ7BjR+Q40d69y9mwoYQ77vBpy0cUuknigOzbR9rdd1vKAtnZeB55pNZiWLkyiWuvTY/osZib66ewsJScHB3vohJb48aG1atL6dYt+knbV1/ZGTnSSfv2mTz3XDKV5jI4LmPglVccXHxxBosXRw7Obto0yKJFZSxc6KJJE21arIoms7rOGNLGjLFMImzsdtxz5kBa2nFeWG0fz/TpKdx+ezoej7XJo3fvcl5/vUwPMHXaaNnSsHJlGYWFpfTqFb0Ktnu3jT/9KY2cnEymTUvh4MGq3++774SbbnIydKiTffusP8cihmHDvKxfX8J112mrx4loMqvjHMuW4Vi92lLmve8+Au3b1/hn+3wwcmQakyZF9q8fM8bDiy+6SE+v8TCUqnM6dgywZImLdetKuPlmH3Z75Andvn02/vKXVHJyzmDixBSKiytOBv1+mDUrmS5dMlmzJnLR3DZtArz1VhlTp3p0nOZJ0mRWh8muXaTdf7+lzN+hA957763xz96/X7j++nSWLrU2eyQlGZ5+2sWjj3q13V6d9tq0CTJnjpvPPy9h6FAvKSmRSe3wYWHGjFRycjK5775U3n03ie7d03nooTRcLmtrR3Ky4aGHPKxdW0rnztr1/pfQn6Pj8cVwBeRgEOfIkcjhw0eLTGoq7tmzwRF5Jledvv7aRvfu6fzrX9YuwfXrB1mxooyBA3VBTaUqa9nS8MQTHjZtKmHMGA+ZmZFJzeMRnn8+hRtuSKeoKLK7/SWX+Pn441Luu89LcuznNY47msyqUH/tWjK6dMG+dm1MPj95zhySPvrIUuaZOJFgdnaNfu6HH9rp3j09ojdVq1YBCgvLuOwyPVtUqiqNGxsefdTL5s2HefhhD40anbhjVL16hpkzXaxeXUbr1tqR6lRpMoumpITmjz+O/ZtvyMjPJ23ECGTfvlr7eNt//kPqxImWMn+3bviGDavRz1240EG/fukcPGjdLbp29VNYWMb55+uBptTJqF8fxo3zsnlzCY895o7apR+gb18fn3xSwqBB5dps/yvp5ositaCA5OLio/eTly0jo1MnHIsWcaLh/nv2CEuWOHjjjSS2bLFRqZXw5JSXkzZ8OOKpmBPOnHFGaHB0DeztbjcsWuTgyivTuesuZ8QgzQEDfKxYUUbDhtpjUalfyumE4cN9bNxYwqxZLrKzQy0bLVoEWbq0jBdecNO4sR5b1SHms+eJyD3AMECA540xT4bL7wJGA37gdWPMn8Ll44EhQAC42xjzdrUGZAwEAhgRy7RRtgMHcI4ejX/pUtwzZkQ09xkD8+cn8/DDqbjd1oRQv36Q5s0NzZsHad48SIsWwaO3mzcPkplZ8dyUqVNJKiqyvN49dSqmWbNq/Zrffmtj/vxkFi1ycOBA9CT5yCMexozx6oweSv1Kyclw663lDBhQzs8/C40aGT2uqllMk5mIXEgokV0M+IC3ROR1oBmQD+QYY7wicnb4+W2B/sBvgaZAoYhkG2Oq70KOCJ7HH2dHXh7ZTzwRMTt90scfk3HppXjHjsU7diykpvLTT8Lo0WlRu9gCHDxo4+BB2LQp+urPDRoEad7ER0vZSasvz6E1I+jCOtqxmWB+b8pvuqlavlogAGvWJDFvXjKFhUkYE/1oSkszzJ7tIj9fx7YoVZ1E4MwztSZWE2JdM2sDrDfGuABEZC3QF+gITDHGeAGMMUfa/PKBZeHyb0Xka0KJcF11B1bWrh2la9eS/MwzpE6Zgrgr5kITn4/Uxx7DsXw5y36/hLuf+1/27z/1JsADB2wcOJDKF1wAXHC0PFNK6LTfTt5UG507++nYMXBK47p+/llYuNDB/PkpfP991XGKGLp39zNhgod27fT6mFIqfsQ6mW0BJotII8AN9AI+A7KBy0RkMuABxhljPgWygPWVXr87XFYzHA5899xDeX4+aePG4SgsPPrQYTK55+sHWTClU8TLMjIMHTv62bXLxq5dNny+U2tPKDGZvPcRvBfu1Gi3G3JyAuTlBcjL89O5c4Bzzol+lmdMaC7FuXOTWbHCgddbdQwNGgQZOLCcwYN9nHeeJjGlVPwRUxPrF/ySAESGAKOAUuBLQkmtB/AecA/QCXgJaAU8DawzxiwKv3Ye8IYxZvmR9zt06NDRL7R9+/bqC9QYGqxZQ/Np01i/vy2D+Ds7OS/iaRddVMLEid+SlRUaoxYMwqEtP1Py5jYOrPuBH/cksZOWR/99RwvKOfVBJVlZHnJzS8nJKSU3t5QmTXysWdOAV145m23bjl+Na9OmjBtvLKZHj/2kpmrTh1KqbmvduvXR2/Xq1bOcoce6ZoYxZh4wD0BECgjVttoAr5pQpv1ERILAmeHHzq308mbA3qreu/IX/6W2b98e8Xpfy2zu3z2KJ5/NxBzTEdSBj0lMYGzGOnxZ08Bux7FyJUkrV0Z06KgsgI0faMJOWvJNiyv4ulV3Npr2rN+UeVJNl3v2pLJnTyqvv34mEGoqrOpaGEBKiqFfv3KGDfPRoUMAaBj+Vz2ibTd1fLrNTo1ut1OTqNst5slMRM42xhSLSHOgH9AFCAL/B3wgItlAMrAPWAUsEZHphDqAtAY+qY04t22zMWyYky1bIjtxtGUrixhIe4rgY0jOy0MCJ9cnxXTsQKP8fM7o04d2LVpUlJsStm+3sX69nfXrk9iwwc4330TvQGJ5vyoSWYsWQYYM8XLrreU0aqS1MKVUYol5MgOWh6+ZlQOjjDEHRGQ+MF9EthDq5Xh7uJa2VUReJtQc6Q8/v0anpAgGYfbsZCZOTI163Wl053U8VtQLp7diauwTJTJ/586U9+lDeZ8+mHPPjfocEcjODpKdHWTQoND0UcXFwoYNFcmtqMgeMS7M+h6GHj38DB3q46qr/NhPnAuVUiouxTyZGWMui1LmAwZW8fzJwOSajgtg925h5EgnH34YuZmaNg3yzDMurriiLf6dH1B+77043n036vsYEQJ5eZTn54cSWNOmpxTP2Wcbevf207t3qMu8ywUbN1Yktw0bkjh8WGjQIMhtt5UzeLCXli21FqaUSnwxT2Z11dtvN2Tq1EwOHYqs+dxwg49p09zUrx+6b1q2xPXKKzhefZXU8eOxFRdjbDYCl1wSSmC9e2POOafaY3Q64dJLA1x6aagmGAzCoUNCvXpGp8ZRSp1WNJkdw++H4cPTWL68VcRj9eoZpk1z8/vfR5k1XoTyG26gvFcv7Js2EWzVCnPWWbUQcQWbDRo00JqYUur0o8nsGElJoRrPsS6/3M8zz7ho1uwEySItjUDnzjUTnFJKqai0MSqKggI3WVmhiX5TUgwFBW5ee63sxIlMKaVUTGgyiyIzEyZO3Elurp8PPihl5EifXoNSSqk6TJsZq3DRRaW8/36ZzmytlFJxQOsbx6GJTCml4oMmM6WUUnFPk5lSSqm4p8lMKaVU3NNkppRSKu5pMlNKKRX3Yr44Z3WrvDinUkqpxHTs4pxaM1NKKRX3NJkppZSKewnXzKiUUur0ozUzpZRScU+TWRQi0lNE/iMiX4vIA7GOJx6IyE4R2SwiRSLyWazjqatEZL6IFIvIlkplDUVkjYhsD/9tEMsY66IqttujIrInvM8ViUivWMZY14jIuSLyvohsE5GtInJPuDwh9zdNZscQETswC7gGaAvcIiJtYxtV3LjSGJNrjOkY60DqsAVAz2PKHgDeNca0Bt4N31dWC4jcbgAzwvtcrjHmjVqOqa7zA/caY9oAecCo8G9ZQu5vmswiXQx8bYzZYYzxAcuA/BjHpBKEMeZDYP8xxfnAi+HbLwLX12pQcaCK7aaOwxjzgzFmY/h2CbANyCJB9zdNZpGygF2V7u8Ol6njM8A7IvK5iPwh1sHEmcbGmB8g9AMEnB3jeOLJaBHZFG6GTIjmspogIi2B9sAGEnR/02QWKdrCL9rl88S6GmM6EGqeHSUil8c6IJXwngX+B8gFfgCmxTacuklEMoDlwBhjzOFYx1NTNJlF2g2cW+l+M2BvjGKJG8aYveG/xcAKQs216uT8JCJNAMJ/i2McT1wwxvxkjAkYY4LA8+g+F0FEHIQS2WJjzKvh4oTc3zSZRfoUaC0i54lIMtAfWBXjmOo0EUkXkcwjt4HfAVuO/ypVySrg9vDt24GVMYwlbhz5QQ7ri+5zFiIiwDxgmzFmeqWHEnJ/00HTUYS7+D4J2IH5xpjJMQ6pThORVoRqYwBJwBLdZtGJyFLgCuBM4CfgEeA14GWgOfA9cKMxRjs7VFLFdruCUBOjAXYCw49cC1IgIpcCHwGbgWC4+EFC180Sbn/TZKaUUiruaTOjUkqpuKfJTCmlVNzTZKaUUiruaTJTSikV9zSZKaWUinuazJSKAyLyoIjMjXUcStVV2jVfqTpAREor3XUCXiAQvj/cGLO49qNSKn5oMlOqjhGRncBQY0xhrGNRKl5oM6NScSC8EOWi8O2WImJE5A4R2SUiB0RkhIh0Cs8gf1BEnj7m9YPDizQeEJG3RaRFbL6JUjVDk5lS8asz0Bq4mdD0aw8B3YHfAjeJSDcAEbme0DRG/YCzCE1xtDQWAStVUzSZKRW//mKM8Rhj3gHKgKXGmGJjzB5CCat9+HnDgb8aY7YZY/xAAZCrtTOVSDSZKRW/fqp02x3lfkb4dgvgb+Hmx4OEVmwWdNFZlUCSYh2AUqrG7QIma49Ilci0ZqZU4psNjBeR3wKISD0RuTHGMSlVrbRmplSCM8asEJEMYFn4OtkhYA3wj9hGplT10XFmSiml4p42MyqllIp7msyUUkrFPU1mSiml4p4mM6WUUnFPk5lSSqm4p8lMKaVU3NNkppRSKu5pMlNKKRX3NJkppZSKe/8PugfenA659ucAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(test_set, color='red', label='Real price (2018 and beyond)')\n",
    "plt.plot(BiLSTM_predicted_stock_price, color='blue', label='predicted price (2018 and beyond)')\n",
    "plt.title('Bi LSTM')\n",
    "plt.xlabel('Time')\n",
    "plt.ylabel('Price')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "root mean squared error is 21.454798116638838.\n"
     ]
    }
   ],
   "source": [
    "BiLSTM_rmse = math.sqrt(mean_squared_error(test_set, BiLSTM_predicted_stock_price))\n",
    "print (\"root mean squared error is {}.\".format(BiLSTM_rmse))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
